/**
 * 静态变量（类变量）、静态方法（类方法）:static声明的属性或方法
 * 静态变量/静态方法生命周期和类相同，在整个执行程序期间都有效
 * 为该类的公用变量，属于类，被该类的所有实例共享，在类载入时被初始化
 * static属于类，static变量只有一份
 * 一般用“类名.类变量/方法”来调用
 * 在static方法中不可以直接访问非static的成员
 */
/*
非静态方法之间可以互相调用，非静态方法也可以调用静态方法；但是静态方法不可以直接调用（未初始化的）非静态方法。
 由于 public static void main 作静态方法，所以遵循这个原则。
*/

public class TestStatic {
    //成员变量，类的内部，方法的外部,可以有n份
    int id;
    String name;

    static String company = "北京尚学堂";//静态类  静态变量,类被加载，静态变量就有效   只有1份，因为类被加载只有一份
    public TestStatic(int id,String name){
        //成员变量
        this.id =id;
        this.name = name;
    }
    //普通方法
    public void login(){
        System.out.println(name);
    }
    //静态方法
    public static void printCompany(){
        //login();//调用非静态成员，编译出错,this.login();也不可以调用，因为this.login()在heep中，static 在方法区
        System.out.println(company);
       // System.out.println(id);  因为public TestStatic(int id,String name)是非静态方法不可以直接调用
    }

    public static void main(String[] args) {
        //public static void方法可以被main方法直接调用，而非static方法不可以。
        printCompany();
        //u是局部变量，在方法或语句块内部
        TestStatic u = new TestStatic(1002,"小华");
        TestStatic.printCompany();//类名.类变量/方法
        TestStatic.company = "北京欢迎你";
        TestStatic.printCompany();
        //普遍方法的输出
        //long();不可以直接被调用，
        /*public void修饰是非静态方法，该类方法属于对象，
         在对象初始化（new Object()）后才能被调用；*/
        TestStatic u2 = new TestStatic(1001,"hua");
        System.out.println(u2.id);
        u2.login();
    }
}
